home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-1 / Inter.Net 55-1.iso / CBuilder / Setup / BCB / data.z / dinput.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-09  |  31.2 KB  |  877 lines

  1. /****************************************************************************
  2.  *
  3.  *  Copyright (C) 1996 Microsoft Corporation.  All Rights Reserved.
  4.  *
  5.  *  File:       dinput.h
  6.  *  Content:    DirectInput include file
  7.  *
  8.  ****************************************************************************/
  9.  
  10. #pragma option push -b
  11.  
  12. #ifndef __DINPUT_INCLUDED__
  13. #define __DINPUT_INCLUDED__
  14.  
  15. #ifdef _WIN32
  16. #define COM_NO_WINDOWS_H
  17. #include <objbase.h>
  18. #endif
  19.  
  20. #ifdef __cplusplus
  21. extern "C" {
  22. #endif
  23.  
  24. #define DIRECTINPUT_VERSION         0x0300
  25.  
  26. /****************************************************************************
  27.  *
  28.  *      Class IDs
  29.  *
  30.  ****************************************************************************/
  31.  
  32. DEFINE_GUID(CLSID_DirectInput,      0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  33. DEFINE_GUID(CLSID_DirectInputDevice,0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  34.  
  35. /****************************************************************************
  36.  *
  37.  *      Interfaces
  38.  *
  39.  ****************************************************************************/
  40.  
  41. DEFINE_GUID(IID_IDirectInputA,     0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  42. DEFINE_GUID(IID_IDirectInputW,     0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  43.  
  44. DEFINE_GUID(IID_IDirectInputDeviceA,0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  45. DEFINE_GUID(IID_IDirectInputDeviceW,0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  46.  
  47. /****************************************************************************
  48.  *
  49.  *      Predefined object types
  50.  *
  51.  ****************************************************************************/
  52.  
  53. DEFINE_GUID(GUID_XAxis,   0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  54. DEFINE_GUID(GUID_YAxis,   0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  55. DEFINE_GUID(GUID_ZAxis,   0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  56. DEFINE_GUID(GUID_RAxis,   0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  57. DEFINE_GUID(GUID_UAxis,   0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  58. DEFINE_GUID(GUID_VAxis,   0xA36D02E5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  59.  
  60. DEFINE_GUID(GUID_Button,  0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  61. DEFINE_GUID(GUID_Key,     0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  62.  
  63. DEFINE_GUID(GUID_POV,     0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  64.  
  65. /****************************************************************************
  66.  *
  67.  *      Predefined product GUIDs
  68.  *
  69.  ****************************************************************************/
  70.  
  71. DEFINE_GUID(GUID_SysMouse,   0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  72. DEFINE_GUID(GUID_SysKeyboard,0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  73.  
  74. /****************************************************************************
  75.  *
  76.  *      Interfaces and Structures...
  77.  *
  78.  ****************************************************************************/
  79.  
  80. /****************************************************************************
  81.  *
  82.  *      IDirectInputDevice
  83.  *
  84.  ****************************************************************************/
  85.  
  86. #define DIDEVTYPE_DEVICE    1
  87. #define DIDEVTYPE_MOUSE     2
  88. #define DIDEVTYPE_KEYBOARD  3
  89. #define DIDEVTYPE_JOYSTICK  4
  90.  
  91. #define DIDEVTYPEMOUSE_UNKNOWN          1
  92. #define DIDEVTYPEMOUSE_TRADITIONAL      2
  93. #define DIDEVTYPEMOUSE_FINGERSTICK      3
  94. #define DIDEVTYPEMOUSE_TOUCHPAD         4
  95. #define DIDEVTYPEMOUSE_TRACKBALL        5
  96.  
  97. #define DIDEVTYPEKEYBOARD_PCXT          1
  98. #define DIDEVTYPEKEYBOARD_OLIVETTI      2
  99. #define DIDEVTYPEKEYBOARD_PCAT          3
  100. #define DIDEVTYPEKEYBOARD_PCENH         4
  101. #define DIDEVTYPEKEYBOARD_NOKIA1050     5
  102. #define DIDEVTYPEKEYBOARD_NOKIA9140     6
  103. #define DIDEVTYPEKEYBOARD_NEC98         7
  104. #define DIDEVTYPEKEYBOARD_NEC98LAPTOP   8
  105. #define DIDEVTYPEKEYBOARD_NEC98106      9
  106. #define DIDEVTYPEKEYBOARD_JAPAN106     10
  107. #define DIDEVTYPEKEYBOARD_JAPANAX      11
  108. #define DIDEVTYPEKEYBOARD_J3100        12
  109.  
  110. #define GET_DIDEVICE_TYPE(dwDevType)    LOBYTE(dwDevType)
  111. #define GET_DIDEVICE_SUBTYPE(dwDevType) HIBYTE(dwDevType)
  112.  
  113. typedef struct _DIDEVCAPS {
  114.     DWORD   dwSize;
  115.     DWORD   dwFlags;
  116.     DWORD   dwDevType;
  117.     DWORD   dwAxes;
  118.     DWORD   dwButtons;
  119.     DWORD   dwPOVs;
  120. } DIDEVCAPS, *LPDIDEVCAPS;
  121.  
  122. #define DIDC_ATTACHED           0x00000001
  123. #define DIDC_POLLEDDEVICE       0x00000002
  124.  
  125. #define DIDFT_ALL           0x00000000
  126.  
  127. #define DIDFT_RELAXIS       0x00000001
  128. #define DIDFT_ABSAXIS       0x00000002
  129. #define DIDFT_AXIS          0x00000003
  130.  
  131. #define DIDFT_PSHBUTTON     0x00000004
  132. #define DIDFT_TGLBUTTON     0x00000008
  133. #define DIDFT_BUTTON        0x0000000C
  134.  
  135. #define DIDFT_POV           0x00000010
  136.  
  137. #define DIDFT_ANYINSTANCE   0x0000FF00
  138. #define DIDFT_MAKEINSTANCE(n) ((BYTE)(n) << 8)
  139. #define DIDFT_GETTYPE(n)     LOBYTE(n)
  140. #define DIDFT_GETINSTANCE(n) HIBYTE(n)
  141.  
  142. typedef struct _DIOBJECTDATAFORMAT {
  143.     const GUID *pguid;
  144.     DWORD   dwOfs;
  145.     DWORD   dwType;
  146.     DWORD   dwFlags;
  147. } DIOBJECTDATAFORMAT, *LPDIOBJECTDATAFORMAT;
  148. typedef const DIOBJECTDATAFORMAT *LPCDIOBJECTDATAFORMAT;
  149.  
  150. typedef struct _DIDATAFORMAT {
  151.     DWORD   dwSize;
  152.     DWORD   dwObjSize;
  153.     DWORD   dwFlags;
  154.     DWORD   dwDataSize;
  155.     DWORD   dwNumObjs;
  156.     LPDIOBJECTDATAFORMAT rgodf;
  157. } DIDATAFORMAT, *LPDIDATAFORMAT;
  158. typedef const DIDATAFORMAT *LPCDIDATAFORMAT;
  159.  
  160. #define DIDF_ABSAXIS            0x00000001
  161. #define DIDF_RELAXIS            0x00000002
  162.  
  163. extern const DIDATAFORMAT c_dfDIMouse;
  164. extern const DIDATAFORMAT c_dfDIKeyboard;
  165.  
  166. typedef struct DIDEVICEOBJECTINSTANCEA {
  167.     DWORD   dwSize;
  168.     GUID    guidType;
  169.     DWORD   dwOfs;
  170.     DWORD   dwType;
  171.     DWORD   dwFlags;
  172.     CHAR    tszName[MAX_PATH];
  173. } DIDEVICEOBJECTINSTANCEA, *LPDIDEVICEOBJECTINSTANCEA;
  174. typedef struct DIDEVICEOBJECTINSTANCEW {
  175.     DWORD   dwSize;
  176.     GUID    guidType;
  177.     DWORD   dwOfs;
  178.     DWORD   dwType;
  179.     DWORD   dwFlags;
  180.     WCHAR   tszName[MAX_PATH];
  181. } DIDEVICEOBJECTINSTANCEW, *LPDIDEVICEOBJECTINSTANCEW;
  182. #ifdef UNICODE
  183. typedef DIDEVICEOBJECTINSTANCEW DIDEVICEOBJECTINSTANCE;
  184. typedef LPDIDEVICEOBJECTINSTANCEW LPDIDEVICEOBJECTINSTANCE;
  185. #else
  186. typedef DIDEVICEOBJECTINSTANCEA DIDEVICEOBJECTINSTANCE;
  187. typedef LPDIDEVICEOBJECTINSTANCEA LPDIDEVICEOBJECTINSTANCE;
  188. #endif // UNICODE
  189. typedef const DIDEVICEOBJECTINSTANCEA *LPCDIDEVICEOBJECTINSTANCEA;
  190. typedef const DIDEVICEOBJECTINSTANCEW *LPCDIDEVICEOBJECTINSTANCEW;
  191. typedef const DIDEVICEOBJECTINSTANCE  *LPCDIDEVICEOBJECTINSTANCE;
  192.  
  193. typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA, LPVOID);
  194. typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKW)(LPCDIDEVICEOBJECTINSTANCEW, LPVOID);
  195. #ifdef UNICODE
  196. #define LPDIENUMDEVICEOBJECTSCALLBACK  LPDIENUMDEVICEOBJECTSCALLBACKW
  197. #else
  198. #define LPDIENUMDEVICEOBJECTSCALLBACK  LPDIENUMDEVICEOBJECTSCALLBACKA
  199. #endif // !UNICODE
  200.  
  201. typedef struct DIPROPHEADER {
  202.     DWORD   dwSize;
  203.     DWORD   dwHeaderSize;
  204.     DWORD   dwObj;
  205.     DWORD   dwHow;
  206. } DIPROPHEADER, *LPDIPROPHEADER;
  207. typedef const DIPROPHEADER *LPCDIPROPHEADER;
  208.  
  209. #define DIPH_DEVICE             0
  210. #define DIPH_BYOFFSET           1
  211. #define DIPH_BYID               2
  212.  
  213. typedef struct DIPROPDWORD {
  214.     DIPROPHEADER diph;
  215.     DWORD   dwData;
  216. } DIPROPDWORD, *LPDIPROPDWORD;
  217. typedef const DIPROPDWORD *LPCDIPROPDWORD;
  218.  
  219. typedef struct DIPROPRANGE {
  220.     DIPROPHEADER diph;
  221.     LONG    lMin;
  222.     LONG    lMax;
  223. } DIPROPRANGE, *LPDIPROPRANGE;
  224. typedef const DIPROPRANGE *LPCDIPROPRANGE;
  225.  
  226. #define DIPROPRANGE_NOMIN       ((LONG)0x80000000)
  227. #define DIPROPRANGE_NOMAX       ((LONG)0x7FFFFFFF)
  228.  
  229. #ifdef __cplusplus
  230. #define MAKEDIPROP(prop)    (*(const GUID *)(prop))
  231. #else
  232. #define MAKEDIPROP(prop)    ((REFGUID)(prop))
  233. #endif
  234.  
  235. #define DIPROP_BUFFERSIZE       MAKEDIPROP(1)
  236.  
  237. #define DIPROP_AXISMODE         MAKEDIPROP(2)
  238.  
  239. #define DIPROPAXISMODE_ABS      0
  240. #define DIPROPAXISMODE_REL      1
  241.  
  242. #define DIPROP_GRANULARITY      MAKEDIPROP(3)
  243.  
  244. #define DIPROP_RANGE            MAKEDIPROP(4)
  245.  
  246. typedef struct DIDEVICEOBJECTDATA {
  247.     DWORD   dwOfs;
  248.     DWORD   dwData;
  249.     DWORD   dwTimeStamp;
  250.     DWORD   dwSequence;
  251. } DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA;
  252.  
  253. #define DIGDD_PEEK          0x00000001
  254.  
  255. #define DISEQUENCE_COMPARE(dwSequence1, cmp, dwSequence2) \
  256.                         ((int)((dwSequence1) - (dwSequence2)) cmp 0)
  257.  
  258. #define DISCL_EXCLUSIVE     0x00000001
  259. #define DISCL_NONEXCLUSIVE  0x00000002
  260. #define DISCL_FOREGROUND    0x00000004
  261. #define DISCL_BACKGROUND    0x00000008
  262.  
  263. typedef struct DIDEVICEINSTANCEA {
  264.     DWORD   dwSize;
  265.     GUID    guidInstance;
  266.     GUID    guidProduct;
  267.     DWORD   dwDevType;
  268.     CHAR    tszInstanceName[MAX_PATH];
  269.     CHAR    tszProductName[MAX_PATH];
  270. } DIDEVICEINSTANCEA, *LPDIDEVICEINSTANCEA;
  271. typedef struct DIDEVICEINSTANCEW {
  272.     DWORD   dwSize;
  273.     GUID    guidInstance;
  274.     GUID    guidProduct;
  275.     DWORD   dwDevType;
  276.     WCHAR   tszInstanceName[MAX_PATH];
  277.     WCHAR   tszProductName[MAX_PATH];
  278. } DIDEVICEINSTANCEW, *LPDIDEVICEINSTANCEW;
  279. #ifdef UNICODE
  280. typedef DIDEVICEINSTANCEW DIDEVICEINSTANCE;
  281. typedef LPDIDEVICEINSTANCEW LPDIDEVICEINSTANCE;
  282. #else
  283. typedef DIDEVICEINSTANCEA DIDEVICEINSTANCE;
  284. typedef LPDIDEVICEINSTANCEA LPDIDEVICEINSTANCE;
  285. #endif // UNICODE
  286. typedef const DIDEVICEINSTANCEA *LPCDIDEVICEINSTANCEA;
  287. typedef const DIDEVICEINSTANCEW *LPCDIDEVICEINSTANCEW;
  288. typedef const DIDEVICEINSTANCE  *LPCDIDEVICEINSTANCE;
  289.  
  290. #undef INTERFACE
  291. #define INTERFACE IDirectInputDeviceW
  292.  
  293. DECLARE_INTERFACE_(IDirectInputDeviceW, IUnknown)
  294. {
  295.     /*** IUnknown methods ***/
  296.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  297.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  298.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  299.  
  300.     /*** IDirectInputDeviceW methods ***/
  301.     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
  302.     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE;
  303.     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
  304.     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
  305.     STDMETHOD(Acquire)(THIS) PURE;
  306.     STDMETHOD(Unacquire)(THIS) PURE;
  307.     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
  308.     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  309.     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
  310.     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
  311.     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
  312.     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE;
  313.     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE;
  314.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  315.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
  316. };
  317.  
  318. typedef struct IDirectInputDeviceW *LPDIRECTINPUTDEVICEW;
  319.  
  320. #undef INTERFACE
  321. #define INTERFACE IDirectInputDeviceA
  322.  
  323. DECLARE_INTERFACE_(IDirectInputDeviceA, IUnknown)
  324. {
  325.     /*** IUnknown methods ***/
  326.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  327.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  328.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  329.  
  330.     /*** IDirectInputDeviceA methods ***/
  331.     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
  332.     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE;
  333.     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
  334.     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
  335.     STDMETHOD(Acquire)(THIS) PURE;
  336.     STDMETHOD(Unacquire)(THIS) PURE;
  337.     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
  338.     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  339.     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
  340.     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
  341.     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
  342.     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE;
  343.     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE;
  344.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  345.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
  346. };
  347.  
  348. typedef struct IDirectInputDeviceA *LPDIRECTINPUTDEVICEA;
  349.  
  350. #ifdef UNICODE
  351. #define IID_IDirectInputDevice IID_IDirectInputDeviceW
  352. #define IDirectInputDevice IDirectInputDeviceW
  353. #define IDirectInputDeviceVtbl IDirectInputDeviceWVtbl
  354. #else
  355. #define IID_IDirectInputDevice IID_IDirectInputDeviceA
  356. #define IDirectInputDevice IDirectInputDeviceA
  357. #define IDirectInputDeviceVtbl IDirectInputDeviceAVtbl
  358. #endif
  359. typedef struct IDirectInputDevice *LPDIRECTINPUTDEVICE;
  360.  
  361. #if !defined(__cplusplus) || defined(CINTERFACE)
  362. #define IDirectInputDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
  363. #define IDirectInputDevice_AddRef(p) (p)->lpVtbl->AddRef(p)
  364. #define IDirectInputDevice_Release(p) (p)->lpVtbl->Release(p)
  365. #define IDirectInputDevice_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a)
  366. #define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c)
  367. #define IDirectInputDevice_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b)
  368. #define IDirectInputDevice_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b)
  369. #define IDirectInputDevice_Acquire(p) (p)->lpVtbl->Acquire(p)
  370. #define IDirectInputDevice_Unacquire(p) (p)->lpVtbl->Unacquire(p)
  371. #define IDirectInputDevice_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b)
  372. #define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d)
  373. #define IDirectInputDevice_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a)
  374. #define IDirectInputDevice_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a)
  375. #define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)
  376. #define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c)
  377. #define IDirectInputDevice_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a)
  378. #define IDirectInputDevice_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
  379. #define IDirectInputDevice_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
  380. #endif
  381.  
  382. /****************************************************************************
  383.  *
  384.  *      Mouse
  385.  *
  386.  ****************************************************************************/
  387.  
  388. typedef struct _DIMOUSESTATE {
  389.     LONG    lX;
  390.     LONG    lY;
  391.     LONG    lZ;
  392.     BYTE    rgbButtons[4];
  393. } DIMOUSESTATE, *LPDIMOUSESTATE;
  394.  
  395. #define DIMOFS_X        FIELD_OFFSET(DIMOUSESTATE, lX)
  396. #define DIMOFS_Y        FIELD_OFFSET(DIMOUSESTATE, lY)
  397. #define DIMOFS_Z        FIELD_OFFSET(DIMOUSESTATE, lZ)
  398. #define DIMOFS_BUTTON0 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 0)
  399. #define DIMOFS_BUTTON1 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 1)
  400. #define DIMOFS_BUTTON2 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 2)
  401. #define DIMOFS_BUTTON3 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 3)
  402.  
  403. /****************************************************************************
  404.  *
  405.  *      Keyboard
  406.  *
  407.  ****************************************************************************/
  408.  
  409. /****************************************************************************
  410.  *
  411.  *      DirectInput keyboard scan codes
  412.  *
  413.  ****************************************************************************/
  414.  
  415. #define DIK_ESCAPE          0x01
  416. #define DIK_1               0x02
  417. #define DIK_2               0x03
  418. #define DIK_3               0x04
  419. #define DIK_4               0x05
  420. #define DIK_5               0x06
  421. #define DIK_6               0x07
  422. #define DIK_7               0x08
  423. #define DIK_8               0x09
  424. #define DIK_9               0x0A
  425. #define DIK_0               0x0B
  426. #define DIK_MINUS           0x0C    /* - on main keyboard */
  427. #define DIK_EQUALS          0x0D
  428. #define DIK_BACK            0x0E    /* backspace */
  429. #define DIK_TAB             0x0F
  430. #define DIK_Q               0x10
  431. #define DIK_W               0x11
  432. #define DIK_E               0x12
  433. #define DIK_R               0x13
  434. #define DIK_T               0x14
  435. #define DIK_Y               0x15
  436. #define DIK_U               0x16
  437. #define DIK_I               0x17
  438. #define DIK_O               0x18
  439. #define DIK_P               0x19
  440. #define DIK_LBRACKET        0x1A
  441. #define DIK_RBRACKET        0x1B
  442. #define DIK_RETURN          0x1C    /* Enter on main keyboard */
  443. #define DIK_LCONTROL        0x1D
  444. #define DIK_A               0x1E
  445. #define DIK_S               0x1F
  446. #define DIK_D               0x20
  447. #define DIK_F               0x21
  448. #define DIK_G               0x22
  449. #define DIK_H               0x23
  450. #define DIK_J               0x24
  451. #define DIK_K               0x25
  452. #define DIK_L               0x26
  453. #define DIK_SEMICOLON       0x27
  454. #define DIK_APOSTROPHE      0x28
  455. #define DIK_GRAVE           0x29    /* accent grave */
  456. #define DIK_LSHIFT          0x2A
  457. #define DIK_BACKSLASH       0x2B
  458. #define DIK_Z               0x2C
  459. #define DIK_X               0x2D
  460. #define DIK_C               0x2E
  461. #define DIK_V               0x2F
  462. #define DIK_B               0x30
  463. #define DIK_N               0x31
  464. #define DIK_M               0x32
  465. #define DIK_COMMA           0x33
  466. #define DIK_PERIOD          0x34    /* . on main keyboard */
  467. #define DIK_SLASH           0x35    /* / on main keyboard */
  468. #define DIK_RSHIFT          0x36
  469. #define DIK_MULTIPLY        0x37    /* * on numeric keypad */
  470. #define DIK_LMENU           0x38    /* left Alt */
  471. #define DIK_SPACE           0x39
  472. #define DIK_CAPITAL         0x3A
  473. #define DIK_F1              0x3B
  474. #define DIK_F2              0x3C
  475. #define DIK_F3              0x3D
  476. #define DIK_F4              0x3E
  477. #define DIK_F5              0x3F
  478. #define DIK_F6              0x40
  479. #define DIK_F7              0x41
  480. #define DIK_F8              0x42
  481. #define DIK_F9              0x43
  482. #define DIK_F10             0x44
  483. #define DIK_NUMLOCK         0x45
  484. #define DIK_SCROLL          0x46    /* Scroll Lock */
  485. #define DIK_NUMPAD7         0x47
  486. #define DIK_NUMPAD8         0x48
  487. #define DIK_NUMPAD9         0x49
  488. #define DIK_SUBTRACT        0x4A    /* - on numeric keypad */
  489. #define DIK_NUMPAD4         0x4B
  490. #define DIK_NUMPAD5         0x4C
  491. #define DIK_NUMPAD6         0x4D
  492. #define DIK_ADD             0x4E    /* + on numeric keypad */
  493. #define DIK_NUMPAD1         0x4F
  494. #define DIK_NUMPAD2         0x50
  495. #define DIK_NUMPAD3         0x51
  496. #define DIK_NUMPAD0         0x52
  497. #define DIK_DECIMAL         0x53    /* . on numeric keypad */
  498. #define DIK_F11             0x57
  499. #define DIK_F12             0x58
  500.  
  501. #define DIK_F13             0x64    /*                     (NEC PC98) */
  502. #define DIK_F14             0x65    /*                     (NEC PC98) */
  503. #define DIK_F15             0x66    /*                     (NEC PC98) */
  504.  
  505. #define DIK_KANA            0x70    /* (Japanese keyboard)            */
  506. #define DIK_CONVERT         0x79    /* (Japanese keyboard)            */
  507. #define DIK_NOCONVERT       0x7B    /* (Japanese keyboard)            */
  508. #define DIK_YEN             0x7D    /* (Japanese keyboard)            */
  509. #define DIK_NUMPADEQUALS    0x8D    /* = on numeric keypad (NEC PC98) */
  510. #define DIK_CIRCUMFLEX      0x90    /* (Japanese keyboard)            */
  511. #define DIK_AT              0x91    /*                     (NEC PC98) */
  512. #define DIK_COLON           0x92    /*                     (NEC PC98) */
  513. #define DIK_UNDERLINE       0x93    /*                     (NEC PC98) */
  514. #define DIK_KANJI           0x94    /* (Japanese keyboard)            */
  515. #define DIK_STOP            0x95    /*                     (NEC PC98) */
  516. #define DIK_AX              0x96    /*                     (Japan AX) */
  517. #define DIK_UNLABELED       0x97    /*                        (J3100) */
  518. #define DIK_NUMPADENTER     0x9C    /* Enter on numeric keypad */
  519. #define DIK_RCONTROL        0x9D
  520. #define DIK_NUMPADCOMMA     0xB3    /* , on numeric keypad (NEC PC98) */
  521. #define DIK_DIVIDE          0xB5    /* / on numeric keypad */
  522. #define DIK_SYSRQ           0xB7
  523. #define DIK_RMENU           0xB8    /* right Alt */
  524. #define DIK_HOME            0xC7    /* Home on arrow keypad */
  525. #define DIK_UP              0xC8    /* UpArrow on arrow keypad */
  526. #define DIK_PRIOR           0xC9    /* PgUp on arrow keypad */
  527. #define DIK_LEFT            0xCB    /* LeftArrow on arrow keypad */
  528. #define DIK_RIGHT           0xCD    /* RightArrow on arrow keypad */
  529. #define DIK_END             0xCF    /* End on arrow keypad */
  530. #define DIK_DOWN            0xD0    /* DownArrow on arrow keypad */
  531. #define DIK_NEXT            0xD1    /* PgDn on arrow keypad */
  532. #define DIK_INSERT          0xD2    /* Insert on arrow keypad */
  533. #define DIK_DELETE          0xD3    /* Delete on arrow keypad */
  534. #define DIK_LWIN            0xDB    /* Left Windows key */
  535. #define DIK_RWIN            0xDC    /* Right Windows key */
  536. #define DIK_APPS            0xDD    /* AppMenu key */
  537.  
  538. /*
  539.  *  Alternate names for keys, to facilitate transition from DOS.
  540.  */
  541. #define DIK_BACKSPACE       DIK_BACK            /* backspace */
  542. #define DIK_NUMPADSTAR      DIK_MULTIPLY        /* * on numeric keypad */
  543. #define DIK_LALT            DIK_LMENU           /* left Alt */
  544. #define DIK_CAPSLOCK        DIK_CAPITAL         /* CapsLock */
  545. #define DIK_NUMPADMINUS     DIK_SUBTRACT        /* - on numeric keypad */
  546. #define DIK_NUMPADPLUS      DIK_ADD             /* + on numeric keypad */
  547. #define DIK_NUMPADPERIOD    DIK_DECIMAL         /* . on numeric keypad */
  548. #define DIK_NUMPADSLASH     DIK_DIVIDE          /* / on numeric keypad */
  549. #define DIK_RALT            DIK_RMENU           /* right Alt */
  550. #define DIK_UPARROW         DIK_UP              /* UpArrow on arrow keypad */
  551. #define DIK_PGUP            DIK_PRIOR           /* PgUp on arrow keypad */
  552. #define DIK_LEFTARROW       DIK_LEFT            /* LeftArrow on arrow keypad */
  553. #define DIK_RIGHTARROW      DIK_RIGHT           /* RightArrow on arrow keypad */
  554. #define DIK_DOWNARROW       DIK_DOWN            /* DownArrow on arrow keypad */
  555. #define DIK_PGDN            DIK_NEXT            /* PgDn on arrow keypad */
  556.  
  557. /****************************************************************************
  558.  *
  559.  *  IDirectInput
  560.  *
  561.  ****************************************************************************/
  562.  
  563. #define DIENUM_STOP             0
  564. #define DIENUM_CONTINUE         1
  565.  
  566. typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA, LPVOID);
  567. typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW, LPVOID);
  568. #ifdef UNICODE
  569. #define LPDIENUMDEVICESCALLBACK  LPDIENUMDEVICESCALLBACKW
  570. #else
  571. #define LPDIENUMDEVICESCALLBACK  LPDIENUMDEVICESCALLBACKA
  572. #endif // !UNICODE
  573.  
  574. #define DIEDFL_ALLDEVICES       0x00000000
  575. #define DIEDFL_ATTACHEDONLY     0x00000001
  576.  
  577. #undef INTERFACE
  578. #define INTERFACE IDirectInputW
  579.  
  580. DECLARE_INTERFACE_(IDirectInputW, IUnknown)
  581. {
  582.     /*** IUnknown methods ***/
  583.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  584.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  585.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  586.  
  587.     /*** IDirectInputW methods ***/
  588.     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEW *,LPUNKNOWN) PURE;
  589.     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE;
  590.     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
  591.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  592.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
  593. };
  594.  
  595. typedef struct IDirectInputW *LPDIRECTINPUTW;
  596.  
  597. #undef INTERFACE
  598. #define INTERFACE IDirectInputA
  599.  
  600. DECLARE_INTERFACE_(IDirectInputA, IUnknown)
  601. {
  602.     /*** IUnknown methods ***/
  603.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  604.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  605.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  606.  
  607.     /*** IDirectInputA methods ***/
  608.     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE;
  609.     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE;
  610.     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
  611.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  612.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
  613. };
  614.  
  615. typedef struct IDirectInputA *LPDIRECTINPUTA;
  616.  
  617. #ifdef UNICODE
  618. #define IID_IDirectInput IID_IDirectInputW
  619. #define IDirectInput IDirectInputW
  620. #define IDirectInputVtbl IDirectInputWVtbl
  621. #else
  622. #define IID_IDirectInput IID_IDirectInputA
  623. #define IDirectInput IDirectInputA
  624. #define IDirectInputVtbl IDirectInputAVtbl
  625. #endif
  626. typedef struct IDirectInput *LPDIRECTINPUT;
  627.  
  628. #if !defined(__cplusplus) || defined(CINTERFACE)
  629. #define IDirectInput_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
  630. #define IDirectInput_AddRef(p) (p)->lpVtbl->AddRef(p)
  631. #define IDirectInput_Release(p) (p)->lpVtbl->Release(p)
  632. #define IDirectInput_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c)
  633. #define IDirectInput_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d)
  634. #define IDirectInput_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a)
  635. #define IDirectInput_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
  636. #define IDirectInput_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
  637. #endif
  638.  
  639. extern HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter);
  640. extern HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTW *ppDI, LPUNKNOWN punkOuter);
  641. #ifdef UNICODE
  642. #define DirectInputCreate  DirectInputCreateW
  643. #else
  644. #define DirectInputCreate  DirectInputCreateA
  645. #endif // !UNICODE
  646.  
  647. /****************************************************************************
  648.  *
  649.  *  Return Codes
  650.  *
  651.  ****************************************************************************/
  652.  
  653. /*
  654.  *  The operation completed successfully.
  655.  */
  656. #define DI_OK                           S_OK
  657.  
  658. /*
  659.  *  The device exists but is not currently attached.
  660.  */
  661. #define DI_NOTATTACHED                  S_FALSE
  662.  
  663. /*
  664.  *  The device buffer overflowed; some input was lost.
  665.  */
  666. #define DI_BUFFEROVERFLOW               S_FALSE
  667.  
  668. /*
  669.  *  The change in device properties had no effect.
  670.  */
  671. #define DI_PROPNOEFFECT                 S_FALSE
  672.  
  673. /*
  674.  *  The device is a polled device.  As a result, device buffering
  675.  *  will not collect any data and event notifications will not be
  676.  *  signalled until GetDeviceState is called.
  677.  */
  678. #define DI_POLLEDDEVICE                 ((HRESULT)0x00000002L)
  679.  
  680. /*
  681.  *  The application requires a newer version of DirectInput.
  682.  */
  683. #define DIERR_OLDDIRECTINPUTVERSION     \
  684.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION)
  685.  
  686. /*
  687.  *  The application was written for an unsupported prerelease version
  688.  *  of DirectInput.
  689.  */
  690. #define DIERR_BETADIRECTINPUTVERSION    \
  691.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP)
  692.  
  693. /*
  694.  *  The object could not be created due to an incompatible driver version
  695.  *  or mismatched or incomplete driver components.
  696.  */
  697. #define DIERR_BADDRIVERVER              \
  698.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL)
  699.  
  700. /*
  701.  * The device or device instance is not registered with DirectInput.
  702.  */
  703. #define DIERR_DEVICENOTREG              REGDB_E_CLASSNOTREG
  704.  
  705. /*
  706.  * The requested object does not exist.
  707.  */
  708. #define DIERR_OBJECTNOTFOUND            \
  709.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
  710.  
  711. /*
  712.  * An invalid parameter was passed to the returning function,
  713.  * or the object was not in a state that admitted the function
  714.  * to be called.
  715.  */
  716. #define DIERR_INVALIDPARAM              E_INVALIDARG
  717.  
  718. /*
  719.  * The specified interface is not supported by the object
  720.  */
  721. #define DIERR_NOINTERFACE               E_NOINTERFACE
  722.  
  723. /*
  724.  * An undetermined error occured inside the DInput subsystem
  725.  */
  726. #define DIERR_GENERIC                   E_FAIL
  727.  
  728. /*
  729.  * The DInput subsystem couldn't allocate sufficient memory to complete the
  730.  * caller's request.
  731.  */
  732. #define DIERR_OUTOFMEMORY               E_OUTOFMEMORY
  733.  
  734. /*
  735.  * The function called is not supported at this time
  736.  */
  737. #define DIERR_UNSUPPORTED               E_NOTIMPL
  738.  
  739. /*
  740.  * This object has not been initialized
  741.  */
  742. #define DIERR_NOTINITIALIZED            \
  743.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY)
  744.  
  745. /*
  746.  * This object is already initialized
  747.  */
  748. #define DIERR_ALREADYINITIALIZED        \
  749.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED)
  750.  
  751. /*
  752.  * This object does not support aggregation
  753.  */
  754. #define DIERR_NOAGGREGATION             CLASS_E_NOAGGREGATION
  755.  
  756. /*
  757.  * Another app has a higher priority level, preventing this call from
  758.  * succeeding.
  759.  */
  760. #define DIERR_OTHERAPPHASPRIO           E_ACCESSDENIED
  761.  
  762. /*
  763.  * Access to the input device has been lost.  It must be re-acquired.
  764.  */
  765. #define DIERR_INPUTLOST                 \
  766.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT)
  767.  
  768. /*
  769.  * The operation cannot be performed while the device is acquired.
  770.  */
  771. #define DIERR_ACQUIRED                  \
  772.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY)
  773.  
  774. /*
  775.  * The operation cannot be performed unless the device is acquired.
  776.  */
  777. #define DIERR_NOTACQUIRED               \
  778.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS)
  779.  
  780. /*
  781.  * The specified property cannot be changed.
  782.  */
  783. #define DIERR_READONLY                  E_ACCESSDENIED
  784.  
  785. /*
  786.  * The device already has an event notification associated with it.
  787.  */
  788. #define DIERR_HANDLEEXISTS              E_ACCESSDENIED
  789.  
  790. /*
  791.  * Data is not yet available.
  792.  */
  793. #ifndef E_PENDING
  794. #define E_PENDING                       0x80070007L
  795. #endif
  796.  
  797. #ifdef __cplusplus
  798. };
  799. #endif
  800.  
  801. #endif  /* __DINPUT_INCLUDED__ */
  802.  
  803. /****************************************************************************
  804.  *
  805.  *  Definitions for non-IDirectInput (VJoyD) features defined more recently
  806.  *  than the current sdk files
  807.  *
  808.  ****************************************************************************/
  809.  
  810. #ifdef _INC_MMSYSTEM
  811. #ifndef MMNOJOY
  812.  
  813. #ifndef __VJOYDX_INCLUDED__
  814. #define __VJOYDX_INCLUDED__
  815.  
  816. #ifdef __cplusplus
  817. extern "C" {
  818. #endif
  819.  
  820. /*
  821.  * Flag to indicate that the dwReserved2 field of the JOYINFOEX structure
  822.  * contains mini-driver specific data to be passed by VJoyD to the mini-
  823.  * driver instead of doing a poll.
  824.  */
  825. #define JOY_PASSDRIVERDATA          0x10000000l
  826.  
  827. /*
  828.  * Informs the joystick driver that the configuration has been changed
  829.  * and should be reloaded from the registery.
  830.  * dwFlags is reserved and should be set to zero
  831.  */
  832. WINMMAPI MMRESULT WINAPI joyConfigChanged( DWORD dwFlags );
  833.  
  834. /*
  835.  * Hardware Setting indicating that the device is a headtracker
  836.  */
  837. #define JOY_HWS_ISHEADTRACKER       0x02000000l
  838.  
  839. /*
  840.  * Hardware Setting indicating that the VxD is used to replace
  841.  * the standard analog polling
  842.  */
  843. #define JOY_HWS_ISGAMEPORTDRIVER    0x04000000l
  844.  
  845. #ifdef __cplusplus
  846. };
  847. #endif
  848.  
  849. #endif  /* __VJOYDX_INCLUDED__ */
  850.  
  851. #endif  /* not MMNOJOY */
  852. #endif  /* _INC_MMSYSTEM */
  853.  
  854. /****************************************************************************
  855.  *
  856.  *  Definitions for non-IDirectInput (VJoyD) features defined more recently
  857.  *  than the current ddk files
  858.  *
  859.  ****************************************************************************/
  860.  
  861. #ifdef _INC_MMDDK
  862. #ifndef MMNOJOYDEV
  863.  
  864. #ifndef __VJOYDXD_INCLUDED__
  865. #define __VJOYDXD_INCLUDED__
  866. /*
  867.  * Poll type in which the do_other field of the JOYOEMPOLLDATA
  868.  * structure contains mini-driver specific data passed from an app.
  869.  */
  870. #define JOY_OEMPOLL_PASSDRIVERDATA  7
  871.  
  872. #endif  /* __VJOYDXD_INCLUDED__ */
  873.  
  874. #endif  /* not MMNOJOYDEV */
  875. #endif  /* _INC_MMDDK */
  876. #pragma option pop
  877.